package com.baizhi.config;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.context.annotation.Configuration;

/**
 * 自定义切片配置类
 */
@Configuration  // 代表当前类是spring配置类
@Aspect     // 代表这个类是一个切面配置类
public class AspectConfig {

    // 前置附加操作
    @Before("execution(* com.baizhi.service.*.*(..))")
    public void before() {
        System.out.println("============= 前置附加操作 =============");
    }

    // 后置附加操作
    @After("execution(* com.baizhi.service.*.*(..))")
    public void after(JoinPoint joinPoint) {
        System.out.println("============= 后置附加操作 =============");
        System.out.println("当前执行目标类：" + joinPoint.getTarget().getClass());
        System.out.println("当前执行目标类中方法：" + joinPoint.getSignature().getName());
    }

    // 环绕附加操作
    // @Around("execution(* com.baizhi.service.*.*(..))")
    // @Around("within(com.baizhi.service.impl.*)")
    @Around("@annotation(com.baizhi.annotation.MyAdvice)")
    public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        System.out.println("============= 进入环绕的前置操作 =============");
        System.out.println("当前执行目标类：" + proceedingJoinPoint.getTarget().getClass());
        System.out.println("当前执行目标类中方法：" + proceedingJoinPoint.getSignature().getName());
        // 放行执行目标方法
        Object proceed = proceedingJoinPoint.proceed();
        System.out.println("============= 进入环绕的后置操作 =============");
        return proceed;     // 返回目标方法返回值
    }
}
